/* View an IMG file header */

#include "global.h"
#include "img.h"			/* img resource file ids */

#define NUM_IMG_DATA_LINES					15

/* .img File data */
typedef struct {
	VOID *			pfcb ;
	UINT				lines ;
	UINT				curr_line ;
	UINT				last_topline ;
	BOOL				redraw ;
	ImgHeader		header ;
} IMG_DATA ;

LOCAL_D IMG_DATA *		pdata = NULL ;

LOCAL_D H_MENU_DATA		Imgmdata[] = {	"File", 2,
													NULL } ;

LOCAL_D TEXT *				Imgcmds[] = {	"oOpen",
													"xExit",
													NULL } ;

LOCAL_C VOID DrawLine(INT line) {
	INT		header_line ;
	TEXT *	res_str = NULL ;
	TEXT		str[128] ;

	header_line = line + pdata->curr_line ;
	if (	header_line < 0 ||
			header_line > 14 )
		return ;


	if (	header_line >= 0 &&
			header_line <= 10 ) {
		UINT		val ;

		/* lines 0-10 */
		
		ReadResource(header_line + RS_IMG_LINE0, &res_str) ;
		if ( header_line == 0 )
			val = pdata->header.ImageVersion ;
		else
			val = *( ((UINT *) &pdata->header.CodeParas) + header_line - 1) ;

		p_atos(str, res_str, val) ;
	}
	else if (	header_line >= 11 &&
					header_line <= 14 ) {
		/* addfiles */

		ReadResource(RS_IMG_ADDFILE, &res_str) ;
		p_atos(	str,
					res_str,
					header_line - 10,
					pdata->header.Add[header_line - 11].offset,
					pdata->header.Add[header_line - 11].length ) ;
	}

	p_free(res_str) ;
	PrintString(str, line) ;
}

#pragma save, ENTER_CALL

LOCAL_C INT ImgCleanUp(VOID) {
	if ( pdata != NULL ) {

		if ( pdata->pfcb != NULL ) {
			p_close(pdata->pfcb) ;
			pdata->pfcb = NULL ;
		}

		p_free(pdata) ;
		pdata = NULL ;
	}

	return(E_APP_NONE) ;
}

LOCAL_C INT ImgInit(VOID) {
	pdata = f_alloc(sizeof(IMG_DATA)) ;

	f_open(&pdata->pfcb, file.name, P_FSTREAM | P_FOPEN | P_FSHARE) ;
	f_read(pdata->pfcb, &pdata->header, sizeof(ImgHeader)) ;
	p_close(pdata->pfcb) ;
	pdata->pfcb = NULL ;

	pdata->lines = metrics.disp_size.y / (metrics.text_height + TEXT_LEADING) ;
	pdata->redraw = TRUE ;
	pdata->curr_line = 0 ;
	if ( NUM_IMG_DATA_LINES >= pdata->lines )
		pdata->last_topline = NUM_IMG_DATA_LINES - pdata->lines ;
	else
		pdata->last_topline = 0 ;

	SetMainWindowExtent(	0,
								0,
								metrics.disp_size.x,
								pdata->lines * (metrics.text_height + TEXT_LEADING) ) ;

	return(E_APP_NONE) ;
}

LOCAL_C INT ImgMenuExec(INT index) {
	switch ( index ) {
		case 0 :
			MainDialog() ;
			break ;
		case 1 :
			Quit() ;
			break ;
		default :
			return(E_APP_NONE) ;
	}
	return(E_APP_NONE) ;
}

LOCAL_C INT ImgUpdate(VOID) {

	if ( pdata->redraw ) {
		TEXT						buf[128] ;
		SCROLL_BAR_STATE		bary ;
		INT						iLp ;

		for ( iLp = 0 ; iLp < pdata->lines ; DrawLine(iLp++) ) ;

		/* Filename : IMG file */
		p_atos(	buf, "%s : IMG file",
					file.name ) ;
		UpdateStatus(buf) ;

		bary.start = (ULONG) pdata->curr_line ;
		bary.size = (ULONG) pdata->lines ;
		bary.total = (ULONG) NUM_IMG_DATA_LINES ;
		UpdateYScroll(&bary) ;

		pdata->redraw = FALSE ;
	}

	return(E_APP_NONE) ;
}

LOCAL_C INT ImgPlainKey(WMSG_KEY *pkey) {
	switch (pkey->keycode) {
		case W_KEY_DOWN :
			if ( pdata->curr_line < pdata->last_topline ) {
				if ( pkey->modifiers & W_CTRL_MODIFIER )
					pdata->curr_line = pdata->last_topline ;
				else
					pdata->curr_line++ ;
				pdata->redraw = TRUE ;
			}
			break ;
		case W_KEY_UP :
			if ( pdata->curr_line > 0 ) {
				if ( pkey->modifiers & W_CTRL_MODIFIER )
					pdata->curr_line = 0 ;
				else
					pdata->curr_line-- ;
				pdata->redraw = TRUE ;
			}
			break ;
		case W_KEY_PAGE_DOWN :
			if ( pdata->curr_line < pdata->last_topline ) {
				pdata->curr_line = MIN(pdata->curr_line + pdata->lines, pdata->last_topline) ;
				pdata->redraw = TRUE ;
			}
			break ;
		case W_KEY_PAGE_UP :
			if ( pdata->curr_line > 0 ) {
				pdata->redraw = TRUE ;
				if ( pdata->curr_line >= pdata->lines )
					pdata->curr_line = pdata->curr_line - pdata->lines ;
				else
					pdata->curr_line = 0 ;
			}
			break ;
		default :
			break ;
	}
	return(E_APP_NONE) ;
}

#pragma restore

LOCAL_C INT ImgRecog(BYTE *buf, UINT buflen) {
	buflen = MIN(buflen, SignatureSize) ;
	return( !p_bcmp(buf, buflen, ImageSignature, buflen) ) ;
}

GLDEF_C VOID ImgDefns(DEFNS *pdefns) {
	pdefns->pfRecognize =	ImgRecog ;

	pdefns->pcmds =			Imgcmds ;
	pdefns->pmdata =			Imgmdata ;
	pdefns->nHelp =			RH_IMG ;
	pdefns->flags =			SCROLL_Y | STATUS_BAR ;
	pdefns->style =			G_STY_MONO ;

	pdefns->pfCleanUp =		ImgCleanUp ;
	pdefns->pfInit =			ImgInit ;
	pdefns->pfFileInfo =		NULL ;
	pdefns->pfUpdate =		ImgUpdate ;
	pdefns->pfMenuExec =		ImgMenuExec ;
	pdefns->pfPlainKey =		ImgPlainKey ;
}

